package com.example.tdam_2012_g3;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import entidades.EnvioMensajeHandler;
import entidades.InteraccionServidor;
import entidades.Log;
import entidades.Mensaje;
import entidades.RegistroUsuarioHandler;

import Adaptadores.AdaptadorMensajeServidor;
import Persistencia.CreadorBD;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Activity_MsjServidor extends ListActivity {

	private static final int DIALOGO_FALLO_ENVIO_MENSAJE = 1;
	private String idContacto;
	private String nombreContacto;
	private String nombreUsuario;
	private EditText txtMensaje;
	private EnvioMensajeHandler handlerMessage;
	private CreadorBD db;
	private AdaptadorMensajeServidor messageAdapter;
	private Context context;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_msj_servidor);
        db=new CreadorBD(this.getApplicationContext());
        Button enviar = (Button) findViewById(R.id.btnEnviarSMSServidor);
        messageAdapter= new AdaptadorMensajeServidor(this);
        txtMensaje = (EditText) findViewById(R.id.edtEnviarMensaje);
        TextView nombre = (TextView) findViewById(R.id.txtNombreContactoServidorMensajes);
        context= this;
        
        
        idContacto = getIntent().getExtras().getString("id_contacto");
        nombreContacto = this.buscarNombreContacto(idContacto);
        nombreUsuario = db.obtenerUsuarioDestino(idContacto);
        nombre.setText(nombreContacto);
       	messageAdapter.agregarMensajes(cargarListaMensajes());
    	setListAdapter(messageAdapter);
    	
    	
        enviar.setOnClickListener(new  android.view.View.OnClickListener(){
        	public void onClick(View v) {
        	    
        		if(readIsConnected()){
        	    String sender = readMyUser(); 
        		String mensajeAEnviar =  txtMensaje.getText().toString();
                threadEnvioSms threadEnviarMensaje = new threadEnvioSms(mensajeAEnviar,nombreUsuario,sender,nombreContacto,context);
                threadEnviarMensaje.execute();
        	
        		      
         
           
        		
        		
        		}
        		else showToast(getApplicationContext().getString(R.string.str_no_hay_conexion)).show();
			}

        
        	 
        });
    }
/*
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_msj_servidor, menu);
        return true;
    }
    
    */
    protected Dialog onCreateDialog(int id) {
        Dialog dialogo = null;
     
        switch(id)
        {
            case DIALOGO_FALLO_ENVIO_MENSAJE:
                dialogo = crearDialogoFalloEnvioMensaje();
                break;
          
        }
     
        return dialogo;
    }
    
    private Dialog crearDialogoFalloEnvioMensaje()
    {
    	String message="";
        final String codigo = handlerMessage.getCode();
    	if(!codigo.equals("")){
        int codigoN=Integer.parseInt(codigo);
    	switch(codigoN) {
    	   case 6:
    		   message = this.getApplication().getString(R.string.str_sms_fail_vacio);
    		   break;
    	   case 11:
    		     message = this.getApplicationContext().getString(R.string.str_send_message_failed_cod11);
    		               break;
    	   default: message = this.getString(R.string.str_send_message_failed_gral)+ codigo;
    	                   break;
    	}
    
    	
    	}
    	else{
    		message = this.getApplicationContext().getString(R.string.str_dialogo_registrar_usuario_fail_gral);
    	}
    	
    
    
    	
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
     
        builder.setTitle(this.getApplicationContext().getString(R.string.str_atencion));
        builder.setMessage(message);
        builder.setPositiveButton("OK", new OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            	if(codigo.equals("11")){
            		startActivity(new Intent(getApplicationContext(),Activity_Nombre_Usuario.class));
            		
            	}else{
            	
                dialog.cancel();
            	}
            }
        });
     
        return builder.create();
    }
    

    
    public String buscarNombreContacto(String id){
  	   String nombre ="";
  	   Cursor nom = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts._ID+" =?",
  			   new String[] {id} ,null);
  	   if(nom.moveToNext()){
  		   nombre = nom.getString(nom.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
  		   
  		  
  	   }
  		nom.close();
  	   return nombre;
     }
    
    public void notificarEnvioSms(){
    	String ns = context.NOTIFICATION_SERVICE;
    	NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
    	int icono = android.R.drawable.sym_action_email;
    	CharSequence mensaje = context.getString(R.string.str_envio_mensaje_exitoso);
    	CharSequence titulo = "Contact Pro";
    	long when = System.currentTimeMillis();
    	
    	
    	Intent notificationIntent = new Intent(context,MainActivity.class);
    	PendingIntent contentIntent = PendingIntent.getActivity(context,0,notificationIntent,0);
    	Notification notification = new Notification(icono,"",when);
    	notification.defaults |= Notification.DEFAULT_SOUND;
    	notification.flags |= Notification.FLAG_AUTO_CANCEL;
    	notification.setLatestEventInfo(getApplicationContext(), titulo, mensaje, contentIntent);
    	mNotificationManager.notify(1, notification);
    	
    	
    }

    
    public Toast showToast(String mensaje){
		Toast toast = Toast.makeText(getApplicationContext(),mensaje,Toast.LENGTH_LONG);
		return toast;
	}
	
	
	public boolean readIsConnected(){
	       	SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
	   		
	   		return myPreference.getBoolean("connected", false);


	       }
	public String readMyUser(){
		SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
		return myPreference.getString("myUser", "a");
	}
	

	 public ArrayList<Mensaje> cargarListaMensajes(){
		  return db.getUserServerMessages(nombreUsuario);
		 
	 }
	 
	 /**
	  * Hilo encargado de enviar y registrar el mensaje web
	  */
	 public class threadEnvioSms extends AsyncTask<Void, Integer, Void> {

		
			private InteraccionServidor interServer;
			private String mensajeAEnviar, destinatario, emisor,nombre_contacto;
			private Context context;
			boolean envioExitoso;
			Mensaje m;


			public threadEnvioSms( String mensaje, String destinatario,
				String emisor, String nombre_contacto, Context context) {
				this.mensajeAEnviar = mensaje;
				this.destinatario = destinatario;
				this.emisor = emisor;
				interServer = new InteraccionServidor();
				this.nombre_contacto =nombre_contacto;
				this.context = context;
				envioExitoso = true;
				
			

			}

			@Override
			protected Void doInBackground(Void... params) {
				 handlerMessage = interServer.parserEnviarMensaje(1, emisor,	destinatario, mensajeAEnviar);
				 envioExitoso=false;
				if (handlerMessage.getType().equals("success")) {

					Log l = new Log();
				    l.setUsuario(nombre_contacto);
					l.setAccion(Log.SERVICE_SMS);
					db.insertarNuevaAccion(l);
					m = new Mensaje(mensajeAEnviar, destinatario, obtenerFechaActual(),obtenerHoraActual());
					db.insertarMensaje(m);
					envioExitoso=true;
					
                    
				} 
				publishProgress();
				return null;

			}

			protected void onPrexecute() {

			}

			protected void onProgressUpdate(Integer... values) {
				
				if(envioExitoso){ 
					notificarEnvioSms();
					messageAdapter.agregarMensaje(m);
				
				}
				else{
				
				
				showDialog(DIALOGO_FALLO_ENVIO_MENSAJE);
				}
			}

			}
	 public String obtenerFechaActual(){
		 Calendar cal = new GregorianCalendar();
		 Date fechaActual = cal.getTime();
		 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
	     String formatteDate = df.format(fechaActual);
	     return formatteDate;
	}
	 
	public String obtenerHoraActual(){
		String resultado;
		int hora,minuto,segundo;
		Calendar calendario = Calendar.getInstance();
		hora=calendario.get(Calendar.HOUR_OF_DAY);
		minuto=calendario.get(Calendar.MINUTE);
		resultado =""+hora+":"+minuto;
		return resultado;
	} 
    
    
}
